# 导入数学库用于数学运算
import math

# 导入类型注解 Tuple
from typing import Tuple


# 定义函数，计算二维向量 (x, y) 的长度
def vector_length(x: float, y: float) -> float:
    # 调用 math.hypot 计算两数的欧几里得长度（欧几里得定理,也称勾股定理）
    return math.hypot(x, y)


# 定义函数，计算二维向量 (x, y) 与 x 轴的夹角（以角度为单位）
def vector_direction(x: float, y: float) -> float:
    # 使用 atan2 计算夹角，再用 degrees 转换为角度
    return math.degrees(math.atan2(y, x))


# 定义函数，计算从点 a 到点 b 的向量
def vector_from_points(
    a: Tuple[float, float], b: Tuple[float, float]
) -> Tuple[float, float]:
    # 返回 b 点减去 a 点得到的向量 (x2-x1, y2-y1)
    return b[0] - a[0], b[1] - a[1]


# 定义一个二维向量 v
v = (3, 4)
# 打印向量 v 的长度，保留两位小数
print(f"向量 {v} 的长度: {vector_length(*v):.2f}")
# 定义一个用于计算方向角的二维向量 v_dir
v_dir = (1, 1)
# 打印向量 v_dir 与 x 轴的夹角，保留两位小数，并加上度数符号
print(f"向量 {v_dir} 的方向角: {vector_direction(*v_dir):.2f}°")
# 定义点 A 的坐标
point_a = (2, 1)
# 定义点 B 的坐标
point_b = (5, 5)
# 计算从点 A 到点 B 的向量
ab = vector_from_points(point_a, point_b)
# 打印该向量
print(f"从点 {point_a} 到点 {point_b} 的向量: {ab}")
# 打印该向量的长度，保留两位小数
print(f"该向量的长度: {vector_length(*ab):.2f}")

# 说明：导入 math 模块，使用数值函数
import math

# 说明：计算绝对值
print("fabs(-5.5) =", math.fabs(-5.5))

# 说明：计算阶乘
print("factorial(5) =", math.factorial(5))

# 说明：向下取整
print("floor(3.7) =", math.floor(3.7))

# 说明：向上取整
print("ceil(-3.2) =", math.ceil(-3.2))

# 说明：截断取整
print("trunc(-3.7) =", math.trunc(-3.7))
